﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;

namespace MP4Player
{
    public partial class MainWindow : Window
    {
        private bool _isPlaying = false; // 记录媒体是否正在播放
        private double _lastVolume = 0.5; // 存储上一个音量级别
        private bool _isPlaylistVisible = true; // 记录播放列表是否可见
        private Dictionary<string, string> _videoFiles = new Dictionary<string, string>(); // 字典用于保存文件名和文件路径的映射
        private DispatcherTimer _doubleClickTimer = new DispatcherTimer(); // 定时器用于处理双击检测
        private DispatcherTimer _updateTimer; // 定时器用于更新进度和时间显示
        private const int DoubleClickThreshold = 300; // 考虑为双击的时间阈值（毫秒）

        public MainWindow()
        {
            InitializeComponent();
            
            // 初始化更新定时器
            _updateTimer = new DispatcherTimer();
            _updateTimer.Interval = TimeSpan.FromMilliseconds(500); // 每500毫秒更新一次
            _updateTimer.Tick += UpdateTimer_Tick; // 附加滴答事件处理程序

            _doubleClickTimer.Interval = TimeSpan.FromMilliseconds(DoubleClickThreshold);
            _doubleClickTimer.Tick += (s, e) => _doubleClickTimer.Stop(); // 超过阈值后停止定时器
        }

        private void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            ProgressSlider.Maximum = mediaElement.NaturalDuration.TimeSpan.TotalSeconds;
            UpdateTimeDisplay();
            _updateTimer.Start(); // 启动更新定时器
        }

        private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
        {
            _isPlaying = false;
            PlayPauseButton.Content = "▶"; // 重置按钮为播放图标
            ProgressSlider.Value = 0; // 重置进度滑块
            TimeDisplay.Text = "00:00 / 00:00"; // 重置时间显示
            _updateTimer.Stop(); // 停止更新定时器
        }

        private void MediaElement_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // 处理单击以播放/暂停
            if (e.ClickCount == 1)
            {
                PlayPauseToggle();
                _doubleClickTimer.Stop(); // 如果检测到单击，则停止定时器
            }
            else if (e.ClickCount == 2) // 处理双击以全屏播放
            {
                ToggleFullScreen();
            }
        }

        private void PlayPauseToggle()
        {
            if (_isPlaying)
            {
                mediaElement.Pause();
                PlayPauseButton.Content = "▶"; // 更改为播放图标
                _updateTimer.Stop(); // 停止更新定时器
            }
            else
            {
                mediaElement.Play();
                PlayPauseButton.Content = "❚❚"; // 更改为暂停图标
                _updateTimer.Start(); // 启动更新定时器
            }
            _isPlaying = !_isPlaying; // 切换播放状态
        }

        private void ToggleFullScreen()
        {
            Console.WriteLine($"Windows State: { WindowState}");
            if (WindowState == WindowState.Normal)
            {
                WindowStyle = WindowStyle.None; // 隐藏窗口边框
                WindowState = WindowState.Maximized; // 最大化窗口
                
                ProcessBar.Height = new GridLength(0);
                ControllerArea.Height = new GridLength(0);
                PlaylistColumn.Width = new GridLength(0);
                _isPlaylistVisible = false;
            }
            else
            {
                WindowStyle = WindowStyle.SingleBorderWindow; // 还原窗口边框
                WindowState = WindowState.Normal; // 恢复窗口状态
                ProcessBar.Height = new GridLength(20);
                ControllerArea.Height = new GridLength(60);
                UpdateTimeDisplay();
            }
        }

        private void PlayPauseButton_Click(object sender, RoutedEventArgs e)
        {
            PlayPauseToggle();
        }

        private void StopButton_Click(object sender, RoutedEventArgs e)
        {
            mediaElement.Stop();
            ProgressSlider.Value = 0; // 重置进度滑块
            _isPlaying = false;
            PlayPauseButton.Content = "▶"; // 重置按钮为播放图标
            _updateTimer.Stop(); // 停止更新定时器
        }

        private void FullScreenButton_Click(object sender, RoutedEventArgs e)
        {
            if (mediaElement.NaturalDuration.HasTimeSpan)
            {
                ToggleFullScreen();
            }
        }

        private void MuteButton_Click(object sender, RoutedEventArgs e)
        {
            if (mediaElement.IsMuted)
            {
                mediaElement.IsMuted = false; // 取消静音
                MuteButton.Content = "🔈"; // 更改为未静音图标
                VolumeSlider.Value = _lastVolume; // 恢复音量
            }
            else
            {
                _lastVolume = VolumeSlider.Value; // 存储当前音量
                mediaElement.IsMuted = true; // 静音
                MuteButton.Content = "🔇"; // 更改为静音图标
                VolumeSlider.Value = 0; // 设置音量为0
            }
        }

        private void VolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            mediaElement.Volume = VolumeSlider.Value; // 设置媒体音量
        }

        private void ProgressSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (mediaElement.NaturalDuration.HasTimeSpan) // 确保有持续时间
            {
                mediaElement.Position = TimeSpan.FromSeconds(ProgressSlider.Value); // 更新媒体位置
                UpdateTimeDisplay(); // 更新时间显示
            }
        }

        private void UpdateTimer_Tick(object sender, EventArgs e)
        {
            if (mediaElement.NaturalDuration.HasTimeSpan) // 确保有持续时间
            {
                ProgressSlider.Value = mediaElement.Position.TotalSeconds; // 更新进度滑块
                UpdateTimeDisplay(); // 更新时间显示
            }
        }

        private void UpdateTimeDisplay()
        {
            // 格式化并更新时间显示
            TimeSpan currentTime = mediaElement.Position;
            TimeSpan totalTime = mediaElement.NaturalDuration.TimeSpan;

            TimeDisplay.Text = $"{currentTime:hh\\:mm\\:ss} / {totalTime:hh\\:mm\\:ss}";
        }

        private void TogglePlaylistButton_Click(object sender, RoutedEventArgs e)
        {
            // 切换播放列表的可见性
            if (_isPlaylistVisible)
            {
                PlaylistColumn.Width = new GridLength(0); // 隐藏播放列表
            }
            else
            {
                PlaylistColumn.Width = new GridLength(200); // 显示播放列表
            }
            _isPlaylistVisible = !_isPlaylistVisible; // 切换状态
        }

        private void AddToPlaylistButton_Click(object sender, RoutedEventArgs e)
        {
            // 选择视频文件并添加到播放列表
            var openFileDialog = new Microsoft.Win32.OpenFileDialog
            {
                Filter = "视频文件 (*.mp4;*.avi)|*.mp4;*.avi|所有文件 (*.*)|*.*",
                Multiselect = true // 允许多选
            };

            if (openFileDialog.ShowDialog() == true)
            {
                foreach (string file in openFileDialog.FileNames) // 遍历所选文件
                {
                    string filename = Path.GetFileName(file); // 获取文件名
                    _videoFiles[filename] = file; // 添加到字典中
                    playlist.Items.Add(filename); // 将文件名添加到播放列表
                }
            }
        }

        private void RemoveFromPlaylistButton_Click(object sender, RoutedEventArgs e)
        {
            // 从播放列表中移除选定项
            if (playlist.SelectedItem != null)
            {
                string selectedFile = playlist.SelectedItem.ToString(); // 获取选定项
                _videoFiles.Remove(selectedFile); // 从字典中移除
                playlist.Items.Remove(selectedFile); // 从播放列表中移除
            }
        }

        private void Playlist_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            // 双击播放列表项以播放选定的视频
            if (playlist.SelectedItem != null)
            {
                string selectedFile = _videoFiles[playlist.SelectedItem.ToString()]; // 获取文件路径
                mediaElement.Source = new Uri(selectedFile); // 设置媒体源
                PlayPauseToggle(); // 播放或暂停
            }
        }

        private void Playlist_Drop(object sender, DragEventArgs e)
        {
            // 处理从外部拖放文件到播放列表
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                foreach (string file in files) // 遍历拖放的文件
                {
                    if (Path.GetExtension(file) == ".mp4" || Path.GetExtension(file) == ".avi") // 仅支持视频文件
                    {
                        string filename = Path.GetFileName(file); // 获取文件名
                        _videoFiles[filename] = file; // 添加到字典中
                        playlist.Items.Add(filename); // 将文件名添加到播放列表
                    }
                }
            }
        }

        private void Playlist_PreviewDragOver(object sender, DragEventArgs e)
        {
            // 处理拖放时的事件，允许文件拖放
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effects = DragDropEffects.Copy; // 允许复制
            }
            else
            {
                e.Effects = DragDropEffects.None; // 不允许
            }
            e.Handled = true; // 标记事件已处理
        }
    }
}
